将 WPF 应用升级到 .NET 7

您所在的位置:网站首页 microsoft edge怎么编辑 将 WPF 应用升级到 .NET 7

将 WPF 应用升级到 .NET 7

2023-06-05 08:53| 来源: 网络整理| 查看: 265

如何将 WPF 桌面应用升级到 .NET 7 项目 06/02/2023

本文介绍如何将 Windows Presentation Foundation (WPF) 桌面应用升级到 .NET 7。 即使 WPF 在 .NET(一种跨平台技术)上运行,WPF 仍然是仅限 Windows 的框架。 可以使用 .NET 升级助手升级以下与 WPF 相关的项目类型:

WPF 项目 控件库 .NET 库

如果要从 .NET Framework 升级到 .NET,请考虑查看 WPF .NET 的差异一文和从 .NET Framework 移植到 .NET 指南。

警告

不要升级 Visual Basic WPF 项目。 扩展似乎存在 bug。 修复 bug 后,将更新本文。

先决条件 Windows 操作系统 面向 .NET 7 的 Visual Studio 2022 版本 17.1 或更高版本 面向 .NET 8 的 Visual Studio 2022 版本 17.7 预览版 1 或更高版本 适用于 Visual Studio 的 .NET 升级助手扩展 演示应用

本文是在升级 Web 收藏夹示例 项目的上下文中编写的,可以从 .NET 示例 GitHub 存储库下载该项目。

启动升级

如果要升级多个项目,请从没有依赖项的项目开始。 在 Web 收藏夹示例中, WebSiteRatings 项目依赖于 StarVoteControl 库,因此应首先升级 StarVoteControl 。

提示

请务必备份代码,例如源代码管理或副本。

使用以下步骤在 Visual Studio 中升级项目:

右键单击“解决方案资源管理器”窗口中的 StarVoteControl 项目,然后选择“升级”:

将打开一个新选项卡,提示你选择升级的执行方式。

选择“ 就地项目升级”。

接下来,选择目标框架。 根据要升级的项目类型,将显示不同的选项。 如果库不依赖于 WPF 等桌面技术,并且可供.NET Framework项目和 .NET 项目使用,则 .NET Standard 2.0 是一个不错的选择。 但是,最新的 .NET 版本比 .NET Standard 提供了许多语言和编译器改进。

选择“ .NET 7.0 ”,然后选择“ 下一步”。

将显示一个树,其中包含与项目相关的所有项目,例如代码文件和库。 可以升级单个项目或整个项目,这是默认设置。 选择“ 升级选择 ”以开始升级。

升级完成后,将显示结果:

升级了具有实心绿色圆圈的项目,而跳过了空的绿色圆圈。 跳过的项目意味着升级助手找不到任何要升级的项目。

升级应用的支持库后,请升级main应用。

升级应用

升级所有支持库后,可以升级main应用项目。 执行以下步骤:

右键单击“解决方案资源管理器”窗口中的“WebSiteRatings”项目,然后选择“升级”: 选择 “就地项目升级 ”作为升级模式。 为目标框架选择 “.NET 7.0 ”,然后选择“ 下一步”。 将所有项目保留为选中状态,然后选择“ 升级选择”。

升级完成后,将显示结果。 如果项目具有警告符号,则表示有一个备注可供阅读,可以通过展开该项目来执行此操作。

生成干净的生成

升级项目后,清理并编译它。

右键单击“解决方案资源管理器”窗口中的“WebSiteRatings”项目,然后选择“清理”。 右键单击“解决方案资源管理器”窗口中的“WebSiteRatings”项目,然后选择“生成”。

如果应用程序遇到任何错误,可以在 “错误列表” 窗口中找到这些错误,并建议如何修复它们。

升级后的步骤

如果项目正在从 .NET Framework 升级到 .NET,请查看从 .NET Framework 升级到 .NET 后进行现代化一文中的信息。

升级后,需要:

检查 NuGet 包。

.NET 升级助手将某些包升级到了新版本。 使用本文中提供的示例应用, Microsoft.Data.Sqlite NuGet 包已从 1.0.0 升级到 7.0.5。 但是, 1.0.0 依赖于 SQLite NuGet 包,但 7.0.5 删除了该依赖项。 SQLite项目仍引用 NuGet 包,尽管不再需要它。 SQLite可以从项目中删除 和 SQLite.Native NuGet 包。

清理旧的 NuGet 包。

packages.config 文件不再需要,可以从项目中删除该文件,因为 NuGet 包引用现在已在项目文件中声明。 此外 ,名为 Packages 的本地 NuGet 包缓存文件夹位于项目的文件夹或父文件夹中。 可以删除此本地缓存文件夹。 新的 NuGet 包引用使用包的全局缓存文件夹,该文件夹位于用户的配置文件目录中,名为 .nuget\packages。

删除库 System.Configuration 。

大多数.NET Framework应用引用库System.Configuration。 升级后,可能仍会直接引用此库。

该 System.Configuration 库使用 app.config 文件为应用提供运行时配置选项。 对于 .NET,此库已替换为 System.Configuration.ConfigurationManager NuGet 包。 删除对库的引用,并将 NuGet 包添加到项目。

检查应用现代化的位置。

自 .NET 发布以来,API 和库发生了很大变化。 在大多数情况下,.NET Framework无法访问这些改进。 通过升级到 .NET,现在可以访问更现代的库。

后续部分介绍本文所用示例应用的现代化方面。

现代化:Web 浏览器控件

WebBrowser WPF 示例应用引用的控件基于已过时的 Internet Explorer。 WPF for .NET 可以使用基于 Microsoft Edge 的 WebView2 控件。 完成以下步骤以升级到新的 WebView2 Web 浏览器控件:

添加 Microsoft.Web.WebView2 NuGet 包。

在 MainWindow.xaml 文件中:

将控件导入根元素中的 wpfControls 命名空间:

在声明 元素的位置下,删除 WebBrowser 控件并将其替换为 wpfControls:WebView2 控件:

编辑 MainWindow.xaml.cs 代码隐藏文件。 更新 ListBox_SelectionChanged 方法以将 browser.Source 属性设置为有效的 Uri。 此代码以前以字符串的形式传入网站 URL,但 WebView2 控件需要 Uri。

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { var siteCollection = (ViewModels.SiteCollection)DataContext; if (siteCollection.SelectedSite != null) browser.Source = new Uri(siteCollection.SelectedSite.Url); else browser.NavigateToString(""); }

根据你的应用的用户运行的 Windows 版本,他们可能需要安装 WebView2 运行时。 有关详细信息,请参阅 WPF 应用中的 WebView2 入门。

现代化:appsettings.json

.NET Framework 使用 App.config 文件为你的应用加载设置,例如连接字符串和日志记录提供程序。 .NET 现在使用 appsettings.json 文件进行应用设置。 通过 System.Configuration.ConfigurationManager NuGet 包在 .NET 中支持 App.config 文件,并且通过 Microsoft.Extensions.Configuration NuGet 包提供对 appsettings.json 的支持。

随着其他库升级到 .NET,它们通过支持 appsettings.json 而不是 App.config进行现代化。例如,已针对 .NET 6+ 升级的 .NET Framework 中的日志记录提供程序不再使用 App.config 进行设置。 最好遵循他们的方向,也不要在可能的情况下使用 App.config 。

将 appsettings.json 与 WPF 示例应用配合使用

例如,升级 WPF 示例应用后,使用 appsettings.json 作为本地数据库的连接字符串。

删除 System.Configuration.ConfigurationManager NuGet 包。

添加 Microsoft.Extensions.Configuration.Json NuGet 包。

将文件添加到名为 appsettings.json 的项目。

将 appsettings.json 文件设置为复制到输出目录。

在解决方案资源管理器中选择文件后,使用“属性”窗口通过 Visual Studio 将副本设置为输出设置。 或者,可以直接编辑项目并添加以下 ItemGroup:

PreserveNewest

将 App.config 文件中的设置迁移到新的 appsettings.json 文件。

在 WPF 示例应用中, app.config 仅包含单个连接字符串。 编辑 appsettings.json 文件以定义连接字符串:

{ "ConnectionStrings": { "database": "DataSource=sqlite.db;" } }

编辑 App.xaml.cs 文件,实例化加载 appsettings.json 文件的配置对象,突出显示添加的行:

using System.Windows; using Microsoft.Extensions.Configuration; namespace WebSiteRatings { /// /// Interaction logic for App.xaml /// public partial class App : Application { public static IConfiguration Config { get; private set; } public App() { Config = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); } } }

在 .\Models\Database.cs 文件中,更改 OpenConnection 方法以使用新的 App.Config 属性。 这需要导入 Microsoft.Extensions.Configuration 命名空间:

using Microsoft.Data.Sqlite; using System.Collections.Generic; using Microsoft.Extensions.Configuration; namespace WebSiteRatings.Models { internal class Database { public static SqliteConnection OpenConnection() => new SqliteConnection(App.Config.GetConnectionString("database")); public static IEnumerable ReadSites()

GetConnectionString 是 Microsoft.Extensions.Configuration 命名空间提供的扩展方法。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3